home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Performance Co-Pilot 1.3
/
SGI Performance Co-Pilot 1.3.iso
/
dist
/
dist6.4
/
pcp.idb
/
usr
/
include
/
pcp
/
pmapi.h.z
/
pmapi.h
Wrap
C/C++ Source or Header
|
1997-04-03
|
16KB
|
507 lines
/* $Id: pmapi.h,v 2.14 1997/03/21 08:28:50 kenmcd Exp $ */
#ifndef _PMAPI_H
#define _PMAPI_H
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/time.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* -------- Naming Services --------
*/
typedef unsigned int pmID; /* Metric Identifier */
#define PM_ID_NULL 0xffffffff
typedef unsigned int pmInDom; /* Instance-Domain */
#define PM_INDOM_NULL 0xffffffff
#define PM_IN_NULL 0xffffffff
#define PM_NS_DEFAULT (char *)0 /* default name */
/*
* Encoding for the units (dimensions Time and Space) and scale
* for Performance Metric Values
*
* For example, a pmUnits struct of
* { 1, -1, 0, PM_SPACE_MBYTE, PM_TIME_SEC, 0 }
* represents Mbytes/sec, while
* { 0, 1, -1, 0, PM_TIME_HOUR, 6 }
* represents hours/million-events
*/
typedef struct {
int dimSpace:4; /* space dimension */
int dimTime:4; /* time dimension */
int dimCount:4; /* event dimension */
int scaleSpace:4; /* one of PM_SPACE_* below */
int scaleTime:4; /* one of PM_TIME_* below */
int scaleCount:4; /* one of PM_COUNT_* below */
} pmUnits; /* dimensional units and scale of value */
/* pmUnits.scaleSpace */
#define PM_SPACE_BYTE 0 /* bytes */
#define PM_SPACE_KBYTE 1 /* Kilobytes (1024) */
#define PM_SPACE_MBYTE 2 /* Megabytes (1024^2) */
#define PM_SPACE_GBYTE 3 /* Gigiabytes (1024^3) */
#define PM_SPACE_TBYTE 4 /* Terabytes (1024^4) */
/* pmUnits.scaleTime */
#define PM_TIME_NSEC 0 /* nanoseconds */
#define PM_TIME_USEC 1 /* microseconds */
#define PM_TIME_MSEC 2 /* milliseconds */
#define PM_TIME_SEC 3 /* seconds */
#define PM_TIME_MIN 4 /* minutes */
#define PM_TIME_HOUR 5 /* hours */
/*
* pmUnits.scaleCount (e.g. count events, syscalls, interrupts, etc.)
* -- these are simply powers of 10, and not enumerated here,
* e.g. 6 for 10^6, or -3 for 10^-3
*/
#define PM_COUNT_ONE 0 /* 1 */
/* Performance Metric Descriptor */
typedef struct {
pmID pmid; /* unique identifier */
int type; /* base data type (see below) */
pmInDom indom; /* instance domain */
int sem; /* semantics of value (see below) */
pmUnits units; /* dimension and units */
} pmDesc;
/* pmDesc.type -- data type of metric values */
#define PM_TYPE_NOSUPPORT -1 /* not implemented in this version */
#define PM_TYPE_32 0 /* 32-bit signed integer */
#define PM_TYPE_U32 1 /* 32-bit unsigned integer */
#define PM_TYPE_64 2 /* 64-bit signed integer */
#define PM_TYPE_U64 3 /* 64-bit unsigned integer */
#define PM_TYPE_FLOAT 4 /* 32-bit floating point */
#define PM_TYPE_DOUBLE 5 /* 64-bit floating point */
#define PM_TYPE_STRING 6 /* array of char */
#define PM_TYPE_AGGREGATE 7 /* arbitrary binary data */
#define PM_TYPE_AGGREGATE_STATIC 8 /* static pointer to arbitrary binary data */
/* pmDesc.sem -- semantics/interpretation of metric values */
#define PM_SEM_COUNTER 1 /* cumulative counter (monotonic increasing) */
/* was PM_SEM_RATE, no longer used now */
#define PM_SEM_INSTANT 3 /* instantaneous value, continuous domain */
#define PM_SEM_DISCRETE 4 /* instantaneous value, discrete domain */
/* Generic Union for Value-Type conversions */
typedef union {
__int32_t l; /* 32-bit signed */
__uint32_t ul; /* 32-bit unsigned */
__int64_t ll; /* 64-bit signed */
__uint64_t ull; /* 64-bit unsigned */
float f; /* 32-bit floating point */
double d; /* 64-bit floating point */
char *cp; /* char ptr */
void *vp; /* void ptr */
} pmAtomValue;
/* PMAPI Error Conditions */
#define PM_ERR_GENERIC -1000
#define PM_ERR_PMNS -1001
#define PM_ERR_NOPMNS -1002
#define PM_ERR_DUPPMNS -1003
#define PM_ERR_TEXT -1004
#define PM_ERR_APPVERSION -1005
#define PM_ERR_VALUE -1006
#define PM_ERR_LICENSE -1007
#define PM_ERR_TIMEOUT -1008
#define PM_ERR_NODATA -1009
#define PM_ERR_FILE -1011
#define PM_ERR_NAME -1012
#define PM_ERR_PMID -1013
#define PM_ERR_INDOM -1014
#define PM_ERR_INST -1015
#define PM_ERR_UNIT -1016
#define PM_ERR_CONV -1017
#define PM_ERR_TRUNC -1018
#define PM_ERR_SIGN -1019
#define PM_ERR_PROFILE -1020
#define PM_ERR_IPC -1021
#define PM_ERR_NOASCII -1022
#define PM_ERR_EOF -1023
#define PM_ERR_NOTHOST -1024
#define PM_ERR_EOL -1025
#define PM_ERR_MODE -1026
#define PM_ERR_LABEL -1027
#define PM_ERR_LOGREC -1028
#define PM_ERR_NOTARCHIVE -1029
#define PM_ERR_NOCONTEXT -1031
#define PM_ERR_PROFILESPEC -1032
#define PM_ERR_PMID_LOG -1033
#define PM_ERR_INDOM_LOG -1034
#define PM_ERR_INST_LOG -1035
#define PM_ERR_NOPROFILE -1036
#define PM_ERR_NOAGENT -1041 /* No pmcd agent for domain of request */
#define PM_ERR_PERMISSION -1042 /* No permission to perform requested operation */
#define PM_ERR_CONNLIMIT -1043 /* PMCD connection limit for this host exceeded */
#define PM_ERR_AGAIN -1044 /* try again. Info not currently available */
#define PM_ERR_ISCONN -1045 /* already connected */
#define PM_ERR_NOTCONN -1046 /* not connected */
#define PM_ERR_NEEDPORT -1047 /* port name required */
#define PM_ERR_WANTACK -1048 /* can not send due to pending acks */
#define PM_ERR_TOOSMALL -1098
#define PM_ERR_TOOBIG -1099
#define PM_ERR_NYI -9999 /* Functionality not yet implemented */
/*
* Report PMAPI errors messages
*/
extern char *pmErrStr(int);
/*
* Load a name space
*/
extern int pmLoadNameSpace(char *);
extern int pmLoadASCIINameSpace(char *, int);
/*
* Trim a name space with respect to the current context
* (usually from an archive, or after processing an archive)
*/
extern int pmTrimNameSpace(void);
/*
* Expand a list of names to a list of metrics (PM_ID_NULL terminated)
*/
extern int pmLookupName(int, char **, pmID *);
/*
* Find the names of descendent nodes in the PMNS
*/
extern int pmGetChildren(char *, char ***);
/*
* Reverse Lookup: find name(s) given a metric
*/
extern int pmNameID(pmID, char **); /* one */
extern int pmNameAll(pmID, char ***); /* all */
/*
* Handy recursive descent of the PMNS
*/
extern int pmTraversePMNS(char *, void(*)(char *));
/*
* Given a metric, find it's descriptor (caller supplies buffer for desc),
* from the current host context.
*/
extern int pmLookupDesc(pmID, pmDesc *);
/*
* Return the internal instance identifier, from the current host context,
* given an instance domain and the external instance name.
* Archive variant scans the union of the indom entries in the archive
* log.
*/
extern int pmLookupInDom(pmInDom, char *);
extern int pmLookupInDomArchive(pmInDom, char *);
/*
* Return the external instance name, from the current host context,
* given an instance domain and the internal instance identifier.
* Archive variant scans the union of the indom entries in the archive
* log.
*/
extern int pmNameInDom(pmInDom, int, char **);
extern int pmNameInDomArchive(pmInDom, int, char **);
/*
* Return all of the internal instance identifiers (instlist) and external
* instance names (namelist) for the given instance domain in the current
* (host) context.
* Archive variant returns the union of the indom entries in the archive
* log.
*/
extern int pmGetInDom(pmInDom, int **, char ***);
extern int pmGetInDomArchive(pmInDom, int **, char ***);
/*
* return the handle of the current context
*/
extern int pmWhichContext(void);
/*
* destroy a context and close it's connection
*/
extern int pmDestroyContext(int);
/*
* Establish a new context (host + instance profile) for the named host
*/
extern int pmNewContext(int, char *);
#define PM_CONTEXT_HOST 1 /* context types */
#define PM_CONTEXT_ARCHIVE 2
/*
* Duplicate current context -- returns handle to new one for pmUseContext()
*/
extern int pmDupContext(void);
/*
* Restore (previously established or duplicated) context
*/
extern int pmUseContext(int);
/*
* Reconnect an existing context (when pmcd dies, etc)
* All existing context settings are preserved.
*/
extern int pmReconnectContext(int);
/*
* Add to instance profile.
* If pmInDom == PM_INDOM_NULL, then all instance domains are selected.
* If no inst parameters are given, then all instances are selected.
* E.g. select all available instances in all domains,
* then use pmProfileAdd(PM_INDOM_NULL);
*/
extern int pmAddProfile(pmInDom, int, int *);
/*
* Delete from instance profile.
* Similar (but negated) functional semantics to pmProfileAdd.
* E.g. to disable all instances in all domains: pmProfileDel(PM_INDOM_NULL);
*/
extern int pmDelProfile(pmInDom, int, int *);
/*
* ---------- Collection services ----------
*
* Result from pmFetch is encoded as a timestamp and vector of pointers
* to pmValueSet instances (one per PMID in the result).
* Each pmValueSet has a PMID, a value count, a value format, and a vector of
* instance-value pairs. Aggregate, string and non-int values are returned
* via one further level of indirection using pmValueBlocks.
*
* timeStamp
* ->pmID
* value format
* instance, value
* instance, value
* ... etc
*
* ->pmID
* value format
* instance, value
* ... etc
*
*
* Notes on pmValueBlock
* 0. may be used for arbitrary binary data
* 1. only ever allocated dynamically, and vbuf expands to accommodate
* an arbitrary value (don't believe the [1] size!)
* 2. len is the length of the len field + the real size of vbuf
* (which includes the null-byte terminator if there is one)
*/
typedef struct {
int len; /* length in bytes */
char vbuf[1]; /* the value */
} pmValueBlock;
typedef struct {
int inst; /* instance identifier */
union {
pmValueBlock *pval; /* pointer to value-block */
int lval; /* integer value insitu (ival 'cuz it WAS a long) */
} value;
} pmValue;
typedef struct {
pmID pmid; /* metric identifier */
int numval; /* number of values */
int valfmt; /* value style */
pmValue vlist[1]; /* set of instances/values */
} pmValueSet;
/* values for valfmt */
#define PM_VAL_INSITU 0 /* value.ival is it */
#define PM_VAL_DPTR 1 /* value.pval->vbuf is it, and dynamic alloc */
#define PM_VAL_SPTR 2 /* value.pval->vbuf is it, and static alloc */
/* Result returned by pmFetch() */
typedef struct {
struct timeval timestamp; /* time stamped by collector */
int numpmid; /* number of PMIDs */
pmValueSet *vset[1]; /* set of value sets, one per PMID */
} pmResult;
/*
* Fetch metrics. Value/instances returned depends on current instance profile.
* By default, all available instances for each requested metric id are
* returned. The metrics argument is terminated with PM_NULL_ID
*
* The value sets returned are in the same order as the metrics argument,
* and the number of value sets returned is guaranteed to be the same as
* the number of metrics in the agument.
*/
extern int pmFetch(int, pmID *, pmResult **);
/*
* variant that is used to return a pmResult from an archive
*/
extern int pmFetchArchive(pmResult **);
/*
* Label Record at the start of every log file - as exported above
* the PMAPI ... note that the struct timeval means we have another
* struct (_pmLogLabel32) for internal use that has a timeval_32 in
* place of the struct timeval.
*/
#define PM_LOG_MAGIC 0x50052600
#define PM_LOG_VERS01 0x1
#define PM_LOG_VOL_TI -2 /* temporal index */
#define PM_LOG_VOL_META -1 /* meta data */
typedef struct {
int ll_magic; /* PM_LOG_MAGIC | log format version no. */
pid_t ll_pid; /* PID of logger */
struct timeval ll_start; /* start of this log */
char ll_hostname[MAXHOSTNAMELEN]; /* name of collection host */
char ll_tz[40]; /* $TZ at collection host */
} pmLogLabel;
/*
* get the label record from the current archive context, and discover
* when the archive ends
*/
extern int pmGetArchiveLabel(pmLogLabel *);
extern int pmGetArchiveEnd(struct timeval *);
/* Free result buffer */
extern void pmFreeResult(pmResult *);
/* Value extract from pmValue and type conversion */
extern int pmExtractValue(int, pmValue *, int, pmAtomValue *, int);
/* Print single pmValue */
extern void pmPrintValue(FILE *, int, int, pmValue *, int);
/* Scale conversion, based on value format, value type and scale */
extern int pmConvScale(int, pmAtomValue *, pmUnits *, pmAtomValue *, pmUnits *);
/* Sort instances for each metric within a pmResult */
extern void pmSortInstances(pmResult *);
/* Adjust collection time and/or mode for pmFetch */
extern int pmSetMode(int, struct timeval *, int);
#define PM_MODE_LIVE 0
#define PM_MODE_INTERP 1
#define PM_MODE_FORW 2
#define PM_MODE_BACK 3
/* Modify the value of one or more metrics */
extern int pmStore(pmResult *);
/* Get help and descriptive text */
extern int pmLookupText(pmID, int, char **);
extern int pmLookupInDomText(pmInDom, int, char **);
#define PM_TEXT_ONELINE 1
#define PM_TEXT_HELP 2
/*
* some handy formatting routines for messages, and other output
*/
extern char *pmIDStr(pmID);
extern char *pmInDomStr(pmInDom);
extern char *pmTypeStr(int);
extern char *pmUnitsStr(pmUnits *);
extern char *pmAtomStr(pmAtomValue *, int);
/* time control client commands, returned by pmTimeRecv() */
#define PM_TCTL_SET 0 /* goto new position, set delta */
#define PM_TCTL_STEP 1 /* update (i.e. fetch), ACK required */
#define PM_TCTL_SKIP 2 /* step (but don't fetch, live only) */
#define PM_TCTL_VCRMODE 3 /* change vcr modes */
#define PM_TCTL_TZ 4 /* use a new timezone (tzlabel and tz)*/
#define PM_TCTL_SHOWDIALOG 5 /* show/hide time controls dialog */
#define PM_TCTL_BOUNDS 6 /* use new archive bounds */
/* time control vcr mode indicators */
#define PM_TCTL_VCRMODE_STOP 0 /* expect long pause */
#define PM_TCTL_VCRMODE_PLAY 1 /* expect slow seq of PM_TCTL_STEP */
#define PM_TCTL_VCRMODE_FAST 2 /* expect rapid seq of PM_TCTL_STEP */
#define PM_TCTL_VCRMODE_DRAG 3 /* expect rapid seq of PM_TCTL_SET */
/* time control connection modes (bitmap) */
#define PM_TCTL_MODE_STANDALONE 1 /* stand-alone mode, single client */
#define PM_TCTL_MODE_MASTER 2 /* use an existing master controller */
#define PM_TCTL_MODE_NEWMASTER 4 /* create new master controller */
#define PM_TCTL_MODE_HOST 8 /* live mode (stop/step available only) */
#define PM_TCTL_MODE_ARCHIVE 16 /* archive mode (full VCR controls) */
/* time control state data */
typedef struct {
int showdialog; /* non-zero => time control dialog is visible */
struct timeval position; /* current time / archive position */
int delta; /* update interval +-milliseconds */
char tzlabel[40]; /* name of current time zone */
char tz[40]; /* current time zone */
struct timeval start; /* controller's current starting time */
struct timeval finish; /* controller's current finish time */
int vcrmode; /* PM_TCTL_VCRMODE_STOP .. PM_TCTL_VCRMODE_DRAG */
} pmTime;
/*
* Connect to time controller in given mode, returns read fd (or err < 0).
* If standalone or new master then use given initial state.
*/
extern int pmTimeConnect(int, char *, pmTime *); /* mode, port, initState */
/* disconnect from time control master or standalone, free internal state. */
extern int pmTimeDisconnect(void);
/* return port name (in static buffer), or NULL if standalone */
extern char *pmTimeGetPort(void);
/* receive a time control command (may block), returns command (or err < 0) */
extern int pmTimeRecv(pmTime *); /* commandBuffer */
/* send ack that PM_TCTL_STEP has been processed */
extern int pmTimeSendAck(struct timeval *); /* actualFetchTime */
/* send earliest and latest archive bounds */
extern int pmTimeSendBounds(struct timeval *, struct timeval *);
/* send a label and a timezone string */
extern int pmTimeSendTimezone(char *, char *);
/* show/hide the master time control dialog */
extern int pmTimeShowDialog(int); /* 0==hide else show */
/* return a char pixmap representing vcrmode (0..3) dir (-1, 0, 1), live (0, 1), record (0, 1) */
extern const char **pmTimeGetStatePixmap(int, int, int, int); /* vcrmode, dir, live, record */
/* parse -S, -T, -A and -O options */
extern int pmParseTimeWindow(
char *, char *, char *, char *,
struct timeval *, struct timeval *,
struct timeval *, struct timeval *, struct timeval *, char **);
#ifdef MALLOC_AUDIT
#include "malloc-audit.h"
#endif
#ifdef __cplusplus
}
#endif
#endif /* _PMAPI_H */